package com.symaster.gameengine.core;

import com.symaster.gameengine.api.EventListener;
import com.symaster.gameengine.util.IdManager;

import java.util.*;

public class SuperObject {
    private final int id;
    private final Map<Class<?>, List<EventListener>> listeners;

    public SuperObject() {
        this.id = IdManager.requestId();
        this.listeners = new HashMap<>();
    }

    /**
     * 添加事件
     *
     * @param l 事件
     */
    public void addListener(EventListener l) {
        listeners.computeIfAbsent(l.getClass(), k -> new ArrayList<>()).add(l);
    }

    /**
     * 删除事件
     *
     * @param l 要删除的事件
     */
    public void removeListener(EventListener l) {
        List<EventListener> eventListeners = listeners.get(l.getClass());
        if (eventListeners != null) {
            eventListeners.remove(l);
        }
    }

    /**
     * 获取指定类的所有事件
     *
     * @param clazz 指定类
     * @return 指定类的所有事件
     */
    public <T extends EventListener> List<T> getListeners(Class<T> clazz) {
        return listeners.getOrDefault(clazz, new ArrayList<>()).stream().map(clazz::cast).toList();
    }

    /**
     * 获取指定类的其中一个事件
     *
     * @param clazz 指定类
     * @return 指定类的其中一个事件
     */
    public <T extends EventListener> T getListener(Class<T> clazz) {
        List<EventListener> eventListeners = listeners.get(clazz);
        if (eventListeners == null || eventListeners.isEmpty()) {
            return null;
        }

        return clazz.cast(eventListeners.get(0));
    }

    public int getId() {
        return id;
    }

    @Override
    public int hashCode() {
        return Objects.hash(id);
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj) {
            return true;
        }
        if (obj instanceof SuperObject) {
            return ((SuperObject) obj).id == id;
        }
        return false;
    }
}
